EAS Build中使用环境变量和密钥
Expo中的环境变量描述了如何使用**.env文件来设置可以在JavaScript代码中内联的环境变量。Expo CLI将在您的代码中适当前缀的变量(例如,process.env.EXPO_PUBLIC_VARNAME
)替换为开发机器上.env**文件中的相应环境变量值。
由于您的EAS Build作业在远程服务器上运行,这些**.env文件可能不可用。例如,如果它们列在.gitignore中或未提交到您的本地版本控制系统中,则.env文件将从上传的项目中排除。此外,您可能希望在JavaScript代码之外使用环境变量来自定义构建时的应用二进制文件,例如设置捆绑标识符或错误报告服务的私钥。因此,EAS Build允许您在eas.json**中设置每个构建配置文件的环境变量,以及不应提交到源代码控制的敏感值,通过EAS Secrets。
在eas.json中设置明文环境变量
用于应用程序代码
如果您在**.env文件中设置了本地开发变量,如环境变量指南中所述,您可以在eas.json**的构建配置文件中设置相同的变量。例如,当本地开发时,您可能会将API URL变量设置为本地后端服务器,测试时设置为测试服务器,生产构建时设置为生 产服务器。
在这种情况下,您的**.env**文件可能如下所示:
EXPO_PUBLIC_API_URL=http://api.local
将所有适用的**.env文件添加到您的.gitignore**(和**.easignore**,如果您的项目有一个)文件中,以便它们不随EAS Build作业一起上传:
# 忽略所有 .env 文件
.env*
然后,您可以在eas.json的每个构建配置文件中设置相同的环境变量:
{
"build": {
"production": {
"env": {
"EXPO_PUBLIC_API_URL": "https://api.production.com"
}
},
"test": {
"env": {
"EXPO_PUBLIC_API_URL": "https://api.test.com"
}
}
}
}
任何对process.env.EXPO_PUBLIC_API_URL
的引用都将根据环境替换为适用的值。
EXPO_PUBLIC_
变量替换在SDK 49及更高版本中可用。
用于您的Expo配置
您可以在动态配置中使用环境变量(app.config.js),以更改应用程序的构建方式。例如,您可能希望更改测试构建的应用程序图标或简称。
在构建配置文件中设置变量:
{
"build": {
"test": {
"env": {
"APP_ICON": "./assets/icon-test.png",
"APP_NAME": "My App (Test)"
}
}
}
}
然后在app.config.js中引用该变量,为本地开发提供回退:
module.exports = {
// 如果定义了变量,则使用它,否则使用回退
icon: process.env.APP_ICON || './assets/icon.png',
name: process.env.APP_NAME || 'My App',
};
所有在eas.json构建配置文件中的环境变量在评估app.config.js时都可用。仅在应用程序代码中使用的变量使用
EXPO_PUBLIC_
前缀是一个好习惯。
用于其他构建步骤
在eas.json构建配置文件中设置的任何环境变量也可用其他构建步骤。
您还可以在构建过程中动态设置环境变量。set-env
可执行文件在EAS Build工作器的PATH
中可用,并且可以用来设置将在下一个构建阶段中可见的环境变量。
例如,您可以在EAS Build钩子中添加以下 内容,环境变量EXAMPLE_ENV
将在构建作业结束之前可用。
set-env EXAMPLE_ENV "example value"
内置环境变量
以下环境变量对每个构建作业都是公开的,可以在任何构建步骤中使用。它们在本地评估app.config.js时不会设置:
CI=1
\- 表示这是一个CI环境EAS_BUILD=true
\- 表示这是一个EAS Build环境EAS_BUILD_PLATFORM
\- 要么是android
要么是ios
EAS_BUILD_RUNNER
\- 要么是eas-build
用于EAS Build云构建,要么是local-build-plugin
用于本地构建EAS_BUILD_ID
\- 构建ID,例如f51831f0-ea30-406a-8c5f-f8e1cc57d39c
EAS_BUILD_PROFILE
\- 来自eas.json的构建配置文件名称,例如production
EAS_BUILD_GIT_COMMIT_HASH
\- Git提交的哈希值,例如88f28ab5ea39108ade978de2d0d1adeedf0ece76
EAS_BUILD_NPM_CACHE_URL
\- npm缓存的URL(了解更多)EAS_BUILD_MAVEN_CACHE_URL
\- Maven缓存的URL(了解更多)EAS_BUILD_COCOAPODS_CACHE_URL
\- CocoaPods缓存的URL(了解更多)EAS_BUILD_USERNAME
\- 启动构建的用户的用户名(对于机器人用户未定义)EAS_BUILD_WORKINGDIR
\- 带有您项目的远程目录路径
在环境变量中使用密钥
为了向您的构建作业提供访问权限,这些权限对于包含在您的源代码和Git仓库中过于敏感的值,您可以使用“密钥”。
一个密钥由名称和值组成。名称只能包含字母数字字符和下划线。值的大小限制为32 KiB。
值可以是文件或字符串值。对于文件,其内容将保存到EAS Build服务器上的临时文件中。文件路径可通过环境变量获得。例如,如果您创建了一个名为SECRET_FILE
的文件密钥,EAS Build将在/Users/expo/workingdir/environment-secrets/__UNIQUE_RANDOM_UUID__
处创建一个文件,并将SECRET_FILE
设置为该路径。
密钥值在静止和传输过程中都是加密的,并且只有在EAS服务器的安全环境中才会解密。
您可以为每个Expo账户创建多达100个账户范围的密钥和每个应用程序100个应用程序特定密钥。账户范围的密钥将暴露在您所有应用程序的所 有构建环境中。应用程序特定的密钥仅适用于它们定义的应用程序,并将覆盖任何具有相同名称的账户范围密钥。
您可以通过Expo网站和EAS CLI管理密钥。
始终记住,任何包含在客户端代码中的都应被视为公共和可读,任何可以运行应用程序的个人都可以访问。 EAS密钥旨在用于提供值给EAS Build作业,以便在构建过程中使用。 正确使用的例子包括设置
NPM_TOKEN
以从npm安装私有包,或Sentry API密钥以创建发布并上传您的sourcemaps到他们的服务。 EAS密钥不为您最终嵌入到应用程序本身的值提供任何额外的安全性,例如AWS访问密钥或其他私有密钥。
在Expo网站上的密钥
要创建账户范围的密钥,请导航到账户设置中的密钥标签。
要创建应用程序特定的密钥,请导航到项目仪表板中的密钥标签。
使用EAS CLI添加密钥
要创建一个新密钥,运行eas secret:create
:
终端
eas secret:create --scope project --name SECRET_NAME --value secretvalue --type string
✔️ 创建了项目@fiberjw/goodweebs上的新密钥SECRET_NAME。
要查看此项目的任何现有密钥,运行eas secret:list
:
终端
eas secret:list
此账户和项目的密钥:
┌────────────────┬────────┬─────────┬──────────────────────────────────────┬─────────────────┐
│ 名称 │ 类型 │ 范围 │ ID │ 更新时间 │
├────────────────┼────────┼─────────┼───── ─────────────────────────────────┼─────────────────┤
│ APP_UPLOAD_KEY │ string │ account │ 366bd434-b538-4192-887c-036c0eddedec │ Oct 05 11:51:46 │
├────────────────┼────────┼─────────┼──────────────────────────────────────┼─────────────────┤
│ NPM_TOKEN │ string │ project │ 03f4881f-88fd-4d94-9e35-a5c34d39c2f2 │ Oct 05 11:51:33 │
├────────────────┼────────┼─────────┼──────────────────────────────────────┼─────────────────┤
│ SECRET_FILE │ file │ project │ 72c7ac1e-78d0-4fa2-b105-229260cecc88 │ Oct 05 11:52:12 │
├────────────────┼────────┼─────────┼──────────────────────────────────────┼─────────────────┤
│ sentryApiKey │ string │ project │ 88dd0296-9119-4d50-a91b-1f646733f569 │ Oct 05 11:51:40 │
└────────────────┴────────┴─────────┴──────────────────────────────────────┴─────────────────┘
从dotenv文件导入密钥
如果您使用**.env**文件在本地存储您的密钥,您可以使用eas secret:push
命令将它们全部导入到EAS:
终端
eas secret:push --scope project --env-file ./eas/.env
✔ 在账户johndoe上创建密钥…` `✔ 在账户johndoe上创建了以下密钥:` `- ABC` `- DEF` `- GHI`
注意,如果dotenv文件中定义的一些密钥已经在服务器上存在,EAS CLI将失败。要强制覆盖这些密钥,请将--force
标志传递给命令。
Doppler集成
您可以使用eas secret:push
命令将EAS 与您的Doppler项目集成:
doppler run --mount ./eas/.env -- eas secret:push --scope project --env-file ./eas/.env
在EAS Build中访问密钥
创建密钥后,您可以在后续的EAS Build作业中使用process.env.VARIABLE_NAME
从Node.js读取它,或在shell脚本中使用$VARIABLE_NAME
。